package steuerung;

import java.util.ArrayList;
import java.util.Observer;

import javax.swing.DefaultComboBoxModel;
import javax.swing.tree.TreeModel;

import steuerung.data.Lager;

/**
 * Der Controller vermittelt zwischen View und Model. 
 * Der Controller wurde als Singleton implementiert, da viele  
 * Klassen aus der View auf den Controller zugreifen.
 *  * 
 * @author Jan Geldermann
 * 
 */
public class Controller {
	private static Controller instance;

	private Model model;

	private Controller() {
		model = new Model();
	}

	public static Controller getInstance() {
		if (instance == null) {
			instance = new Controller();
		}

		return instance;
	}

	public void start() {
		model.start();
	}

	public TreeModel getLagerModel() {
		return model.getLagerModel();
	}

	public Lager getLager(String lagerName) {
		return model.getLager(lagerName);
	}

	public String initialisiereNeueLieferung(int menge, String art) {
		return model.initialisiereNeueLieferung(menge, art);
	}

	public String getNeueLieferungArt() {
		return model.getNeueLieferungArt();
	}

	public DefaultComboBoxModel<String> getTreeNodes() {
		return model.getTreeNodes();
	}

	public int getNeueLieferungMenge() {
		return model.getNeueLieferungMenge();
	}

	public double addNeueBuchung(Lager l, int menge) {
		return model.addNeueBuchung(l, menge);
	}

	public void finalizeNeueLieferung() {
		model.finalizeNeueLieferung();
	}

	public void neueLieferungAbbrechen() {
		model.neueLieferungAbbrechen();
	}

	public String[][] getLieferungenFuerTabelle() {
		return model.getLieferungenFuerTabelle();
	}

	public String[][] getBuchungenVonLieferungFuerTabelle(String lfnr,
			boolean isNeueLieferung) {
		return model.getBuchungenVonLieferungFuerTabelle(lfnr, isNeueLieferung);
	}

	public String[][] getBuchungenVonLagerFuerTabelle(String lagerName) {
		return model.getBuchungenVonLagerFuerTabelle(lagerName);
	}

	public int benenneLager(String lagerName, String neuerName) {
		return model.benenneLager(lagerName, neuerName);
	}

	public void addObserver(Observer o) {
		model.addObserver(o);
	}
}
